import Cookies from 'js-cookie'
import API from './index.js'
import jwt_decode from "jwt-decode" ;
import store from '../store'

const token = {
    /**
     * 获取访问令牌
     */
    async getAccessToken() {
       let accessToken =  Cookies.get("accessToken") ;

       if (accessToken == null) {
           // 如果 Cookie 中没有 访问令牌，说明 没有登录，或者 令牌已失效
           let refreshToken = Cookies.get("refreshToken") ;
           let rememberMe = Cookies.get("remember-me") ;
           if (refreshToken == null) { // 说明一定没有登录
                // 跳转到 登录页面
               throw "未登录" ;
           }
           // 调用 /api/token 接口，使用 刷新令牌 获取 访问令牌
           let {status, accessToken, refreshToken: refresh} = await API.getAccessToken(refreshToken).then(ret=> ret.data) ;
            // 如果接口调用成功，
           if (status === "10000") {
                // 将 刷新令牌 和 访问 令牌 存储到 Cookie 中
               this.saveToken(accessToken, refresh, rememberMe);
               return accessToken ;
           }

           throw "未登录" ;
       }
       return accessToken ;
    },
    saveToken(accessToken , refreshToken, rememberMe) {  // 存储令牌
        if (!rememberMe) {
            Cookies.set("accessToken", accessToken) ;
            Cookies.set("refreshToken", refreshToken) ;
            Cookies.set("remember-me", 0) ;
        }else{
            // 将 信息存储到 Cookie 中，且 记录存活时间， 解析令牌，获取令牌中的 过期时间
            let tokenMsg = jwt_decode(accessToken);
            Cookies.set("accessToken", accessToken, { expires: new Date(tokenMsg.exp * 1000) })
            let refreshMsg = jwt_decode(refreshToken);
            Cookies.set("refreshToken", refreshToken, { expires: new Date(refreshMsg.exp * 1000) })
            Cookies.set("remember-me", 1, { expires: new Date(refreshMsg.exp * 1000)}) ;
        }
        // 获取 用户名，并存储到 状态管理 vuex 中
        this.setCurrentUserAndAuthorities(accessToken);
    },

    setCurrentUserAndAuthorities(token) {
        let tokenMsg = jwt_decode(token);
        // 更新状态管理中的 user
        store.commit("updateUser", tokenMsg.sub);
        store.commit("modifyAuthorities", tokenMsg.authorities);
    },
    getCurrentUser() {
        return store.state.user;
    },
    getAuthorities() {
        return store.state.authorities ;
    },
    removeCookies() {
        Cookies.remove("accessToken");
        Cookies.remove("refreshToken");
        Cookies.remove("remember-me");
    }
}

export default token ;